//链接：https://www.nowcoder.com/questionTerminal/95e35e7f6ad34821bc2958e37c08918b?f=discussion
//来源：牛客网
//
//这道题的核心在于 递归的思想
//也就是经典的装错信封问题
// 用A、B、C……表示写着ｎ位友人名字的信封，a、b、c……表示ｎ份相应的写好的信纸。把错装的总数为记作D(n)。假设把ａ错装进Ｂ里了，包含着这个错误的一切错装法分两类：
//(1)b装入Ａ里，这时每种错装的其余部分都与A、B、a、b无关，应有D(n－2)种错装法。
//(2)ｂ装入A、B之外的一个信封，这时的装信工作实际是把（除a之外的）n－1份信纸ｂ、ｃ……装入（除B以外的）n－1个信封A、C……，显然这时装错的方法有D(n－1)种。
//总之在ａ装入B的错误之下，共有错装法D(n－2)＋D(n－1)种。
//a装入C，装入D……的n－2种错误之下，同样都有D(n－1)＋D(n－2)种错装法，因此D(n)＝(n－1)[D(n－1)＋D(n－2)]
	
//发邮件
//链接：https://www.nowcoder.com/questionTerminal/95e35e7f6ad34821bc2958e37c08918b?f=discussion
//		来源：牛客网
//
//		这道题的核心在于 递归的思想
//		也就是经典的装错信封问题
//		用A、B、C……表示写着ｎ位友人名字的信封，a、b、c……表示ｎ份相应的写好的信纸。把错装的总数为记作D(n)。假设把ａ错装进Ｂ里了，包含着这个错误的一切错装法分两类：
//		(1)b装入Ａ里，这时每种错装的其余部分都与A、B、a、b无关，应有D(n－2)种错装法。
//		(2)ｂ装入A、B之外的一个信封，这时的装信工作实际是把（除a之外的）n－1份信纸ｂ、ｃ……装入（除B以外的）n－1个信封A、C……，显然这时装错的方法有D(n－1)种。
//		总之在ａ装入B的错误之下，共有错装法D(n－2)＋D(n－1)种。
//		a装入C，装入D……的n－2种错误之下，同样都有D(n－1)＋D(n－2)种错装法，因此D(n)＝(n－1)[D(n－1)＋D(n－2)]
	import java.util.Scanner;

	

	//用的是单步最优的考虑想法，从最后一步开始考虑。

	//为了方便理解，假设有5个人ABCDE，原来只有4个人ABCD。则多出来的一个人E，

	//多出来的邮件E必定发错给ABCD中一个，共四种方法。假设给E的邮件发给了D，则

	//  人 ：   A  B  C  D  E

	// 邮件：            E

	//则发给D的邮件D有两种情况：一是正好发给了人E，二是发给了E以外的人（ABC）

	//若情况一：变成了3人各自错收了邮件。

	//若情况二：由于D不能发给E，我们可以假象D就是E（和原来等价），则此时变成了ABCE错发给ABCE，就等价于4人错收邮件。

	//这样就很明白了，f（n）=（n-1）*[f（n-2）+f（n-1）]

	public class Main {

	

	 public static void main(String[] args) {

	  Scanner in= new Scanner(System.in);

	  

	  long c[]=new long[22];

	  c[2]=1;

	  c[3]=2;

	  for(int i=4;i<22;i++){

	   c[i]=(i-1)*(c[i-1]+c[i-2]);

	  }

	  while(in.hasNext()){

	   int n=in.nextInt();

	   System.out.println(c[n]);

	  }

	  

	 }

	

	}

